﻿/*=======================================================================
(c) Topbot, 2009 http://ya.topbot.ru
=======================================================================*/

namespace BlogsAPI.BlogsYandex
{
    using System.Text.RegularExpressions;
    using RssToolkit.Rss;
    using System.IO;
    using System.Text;
    using System.Net;
    using System.Diagnostics;
    using System;
    using System.Collections.Generic;

    /// <summary>
    /// Тема дня на Яндексе
    /// </summary>
    public class Theme
    {
        /// <summary>
        /// номер темы
        /// </summary>
        public int Id;

        /// <summary>
        /// название темы
        /// </summary>
        public string Title;

        /// <summary>
        /// Извлечение RSS для темы дня
        /// </summary>
        /// <returns></returns>
        public RssDocument GetRss()
        {
            if (String.IsNullOrEmpty(Title)) throw new ArgumentNullException();
            return RssDocument.Load(new Uri(
                                        String.Format("https://blogs.yandex.ru/search.rss?cat=theme&id={0}&group=2", Id)));
        }
    }

    /// <summary>
    /// Загрузка и обработка топовых тем Яндекса
    /// https://blogs.yandex.ru/search.xml?cat=theme
    /// </summary>
    public class TopTheme: Abstract.WebInterface
    {
        private const string _sUrl = "https://blogs.yandex.ru/search.{0}?cat=theme&id={1}&group=2";
        private Regex _rTheme = new Regex(@"<li>\s*<a\s+href\W+[^ ]+?id\=(\d+)\D[^>]+>([^<]+)<", RegexOptions.Singleline|RegexOptions.Compiled);
        private Regex _rKeywords = new Regex(@"&lt;b&gt;([^&]{4,})&lt;/b&gt;", RegexOptions.Singleline | RegexOptions.Compiled);

        private string[] noise = new[] { "", "!", "~!", "+!","!!!", "СРОЧНО", "важное", "ВАЖНО",
            "ЧИТАТЬ", "СЮДА", "Ааааа","АаАаАаА", "ВОТ", "НОВОСТЬ", "ЭТО", "Ссылка", "Опять", "ППЦ", "где", 
            "сегодня", "сейчас", "[ВИДЕО]","[video]","(видео)","(video)","(фото)","(photo)","у нас","сообщили",
            "ТВ","мозг","11!!!","копирую","распростроняю"};

        Random randomizer = new Random(DateTime.Now.Millisecond);

        /// <summary>
        /// прост перечисление номеров всех тем.
        /// </summary>
        public List<String> themes = new List<string>();

        /// <summary>
        /// Инициализируемся генератором случайных чисел
        /// </summary>
        public TopTheme()
        {
            randomizer = new Random(DateTime.Now.Millisecond);
        }

        /// <summary>
        /// Получение списка Текущих тем
        /// </summary>
        /// <returns></returns>
        public List<Theme> LoadLasts()
        {
            List<Theme> oRet = new List<Theme>();
            try
            {
                HttpWebRequest myHttpWebRequest;
                HttpWebResponse myHttpWebResponse;
                myHttpWebRequest = MakeRequest(String.Format(_sUrl,"xml", 0));
                myHttpWebRequest.Method = "GET"; // метод GET
                myHttpWebRequest.Referer = "https://blogs.yandex.ru";
                //получаем ответ и его разбираем...
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                string result = new StreamReader(myHttpWebResponse.GetResponseStream(),
                    Encoding.UTF8).ReadToEnd();
                myHttpWebResponse.Close();
                //делаем вычленение тем..
                MatchCollection mc = _rTheme.Matches(result);
                if(mc.Count>0)
                {
                    foreach (Match m in mc)
                    {
                        themes.Add(m.Groups[1].Value);
                        oRet.Add(new Theme
                                     {
                                         Id = int.Parse(m.Groups[1].Value),
                                         Title = m.Groups[2].Value
                                     });
                    }
                }
            }catch(Exception e1)
            {
                Debug.Write(e1.Message);
            }
            return oRet;
        }

        /// <summary>
        /// Формируем пост по теме из уже опубликованного
        /// </summary>
        /// <param name="th">Тема</param>
        /// <returns></returns>
        public BlogPost FormThemePost(Theme th)
        {
            BlogPost bp = new BlogPost();
            try
            {
                #region Заголовок и тэги
                //берем именно XML , чтобы определить слова выделенные жиным для заголовка
                HttpWebRequest myHttpWebRequest;
                HttpWebResponse myHttpWebResponse;
                myHttpWebRequest = MakeRequest(String.Format(_sUrl, "rss", th.Id));
                myHttpWebRequest.Method = "GET"; // метод GET
                myHttpWebRequest.Referer = "https://blogs.yandex.ru";
                //получаем ответ и его разбираем...
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                string result = new StreamReader(myHttpWebResponse.GetResponseStream(),
                    Encoding.UTF8).ReadToEnd();
                myHttpWebResponse.Close();
                MatchCollection mc = _rKeywords.Matches(result);
                if (mc.Count > 0)
                {
                    for(int i=0;i<4;i++)//3 в заголовок и 1 в тэги
                    {
                        string toadd = mc[randomizer.Next(0, mc.Count)].Groups[1].Value;
                        if(!bp.Subject.Contains(toadd))
                        {
                            if (i == 3)
                            {
                                bp.SetParam(PostParams.Tags,toadd);
                            }
                            else
                            {
                                bp.Subject += toadd + " ";
                            }
                        }
                    }
                    bp.Subject = RandomTitle(bp.Subject);
                }else
                {
                    bp.Subject = RandomTitle(th.Title);
                }
                #endregion заголовок и тэги

                #region Содержимое

                RssDocument rss = RssDocument.Load(result);
                if(rss!=null && rss.Channel!= null && rss.Channel.Items!=null)
                {
                    int i = 0;
                    while(rss.Channel.Items.Count>0)
                    {
                        int pos = randomizer.Next(0, rss.Channel.Items.Count);
                        RssItem post = rss.Channel.Items[pos];
                        rss.Channel.Items.RemoveAt(pos);
                        string desc = post.Description.Replace("</b>", "").Replace("<b>", "").Trim();
                        if (!bp.Body.Contains(desc))
                        {
                            if (i++%3 == 2)
                            {
                                bp.Body += "<a href='" + post.Link + "'>" + desc + "</a><br/><br/>";
                            }
                            else
                            {
                                bp.Body += desc;
                            }
                        }
                    }
                }

                #endregion
            }
            catch(Exception e1)
            {
                Debug.Write(e1.Message);
            }
            return bp;
        }

        /// <summary>
        /// Рандомизация заголовка 
        /// </summary>
        /// <param name="title"></param>
        /// <returns></returns>
        private string RandomTitle(string title)
        {
            string toadd = noise[randomizer.Next(0, noise.Length)];
            return randomizer.Next(0, 2) == 0 ? toadd + " " + title : title + " " + toadd;
        }

    }
}
